package com.laolei.core.rest.annotation;

import static java.lang.annotation.ElementType.ANNOTATION_TYPE;
import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.ElementType.TYPE;
import static java.lang.annotation.RetentionPolicy.RUNTIME;

import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;

import com.laolei.core.model.Entity;

@Documented
@Retention(RUNTIME)
@Target({ TYPE, METHOD, ANNOTATION_TYPE })
public @interface RestClient {
	/**
	 * 请求的主机地址的key，该值会以 这个key取laolei.dohttp.[key].的值，如果找不到，默认是
	 * 主机地址127.0.0.1,主机端口 80
	 * 
	 * @return
	 */
	String serverid() default "";

	/**
	 * 请求的路径,例如/,/a,/a/{{pathname}}
	 * 
	 * @return
	 */
	String path() default "";

	/**
	 * 发起请求的方法,填多个只会第一个生效,默认GET请求
	 * 
	 * @return
	 */
	RestMethod method() default RestMethod.AUTO;

	/**
	 * http 服务版本参数，会以请求参数的形式发出；
	 * 
	 * @return
	 */
	String version() default "";

	/**
	 * 是否当做from表单提交,如果不设置默认是no
	 * 
	 * @return
	 */
	I from() default I.AUTO;

	/**
	 * 是否需要缓存,如果不设置默认是no
	 * 
	 * @return
	 */
	I cache() default I.AUTO;

	/**
	 * 缓存超时时间,单位秒，默认5秒
	 * 
	 * @return
	 */
	int cacheTimeout() default -1;

	/**
	 * 是否需要手动处理响应结果，如果是接口定义的，该参数无效，如果是实例类默认yes,
	 * no:结果集根据返回类型处理为返回，返回类型如果是string，直接返回，如果不是，当做json处理,处理失败会抛出运行时异常，方法体内容不会执行,
	 * yes:不会自动处理响应结果集,方法体内容内容会执行,方法体内可以用 User
	 * user=HttpContext.getBodyToObject(new TypeReference<User>() {});
	 * 获取响应结果手动处理
	 * 
	 * @return
	 */
	I manuallyprocessed() default I.AUTO;

	/**
	 * 是否需要自动解包，默认为yes
	 * 
	 * @return
	 */
	I unpack() default I.AUTO;
	
	@SuppressWarnings("rawtypes")
	Class<? extends Entity> packClass() default Entity.class;

	enum I {
		AUTO, YES, NO;

		public boolean isYes() {
			return this == YES;
		}

		public boolean isNo() {
			return this == NO;
		}

		public boolean isAuto() {
			return this == AUTO;
		}
	}
}
